チャットインターフェース


Spread.Viewsを使用すると、インタラクティブなチャットインタフェースを作成できます。これには、行テンプレート機能を使用して、テーブルのデータを配置します。これに基づき、グリッドレイアウトを使用してチャットインタフェースを作成します。

Spread.Viewsを使用して、次のイメージのようなスレッド形式のチャットインタフェースを作成するには、次の手順を実行します。

chat_like_Structure

  1. 以下の参照をプロジェクトに追加します。
    <link rel="stylesheet" type="text/css" href="[Your Stylesheet Path]/gc.spread.views.dataview.10.0.0.css">
    <script src="[Your Script Path]/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>
    <script src="[Your Script Path]/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
    <script src="[Your Script Path]/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
    <script src="[Your Script Path]/gc.spread.views.timelinegrouping.10.0.0.min.js" type="text/javascript"></script>
    <script src="[Your Script Path]/zepto.min.js" type="text/javascript"></script>
    <script src="[Your Script Path]/license.js" type="text/javascript"></script>
    <script src="data/conversation.js" type="text/javascript"></script>
  2. headタグ内に、インタフェースにスタイルを適用するためのstyleタグを追加します。

     * {
                 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
             }
    
             .gc-grid {
                 border: none;
             }
    
             .photo-container {
                 width: 50px;
                 display: inline-block;
                 vertical-align: top;
             }
    
             .message-container {
                 width: calc(100% - 50px);
                 display: inline-block;
                 vertical-align: top;
             }
    
             .employee-photo {
                 width: 40px;
                 height: 40px;
                 border-radius: 4px;
                 margin-left: 5px;
                 margin-right: 5px;
             }
    
             .float-left {
                 float: left;
             }
    
             .float-right {
                 float: right;
             }
    
             .tml {
                 margin: 8px;
             }
    
             .contentContainer {
                 width: 100%;
             }
    
             .name {
                 font-weight: bold;
             }
    
             .time {
                 color: #9e9ea6;
                 margin-left: 8px;
             }
    
             .contentContainer.float-right .chat-content {
                 float: right;
             }
    
             .chat-content {
                 display: inline-block;
                 line-height: 17px;
                 color: #333;
                 font-weight: normal;
                 font-size: 14px;
                 background-color: #cfedfb;
                 padding: 5px 10px;
                 white-space: pre-line;
                 word-wrap: break-word;
                 border-radius: 3px;
                 text-align: left;
                 max-width: 100%;
                 box-sizing: border-box;
                 margin: 0;
             }
    
             .gc-cell-border {
                 border: none;
             }
    
             .gc-cell {
                 overflow: inherit;
                 white-space: normal;
                 padding: 0px;
             }
    
             .divider {
                 padding: 0.4em 1em;
                 color: #333;
                 position: relative;
                 text-align: center;
                 text-transform: uppercase;
                 font-size: 12px;
             }
    
             .gc-focused {
                 border-radius: 5px;
             }
    
             .gc-focused .chat-content {
                 background: initial;
             }
    
             .gc-group-header-row {
                 background: initial;
        }
  3. bodyタグ内にdivタグを追加して、ページ内のコンテナとしてDOM要素を含めます。

     <div style="height: 100%; position: relative">
            <div id="gridContainer" style="height:100%;">
                <div id="grid1" style="height:100%;position: relative"></div>
            </div>
            <template id="rowtml">
            {{? it.name === "David Archer" || it.name === "Tomas Hood"}}
            <div class="tml">
                <div class="message-container">
                    <div data-column="time" class="time float-right" ></div>
                    <div data-column="name" class="name float-right"></div>
                    <div data-column="content" class = "contentContainer float-right" ></div>
                </div>
                <div class="photo-container">
                    <div data-column="photo"></div>
                </div>
            </div>
            {{??}}
            <div class="tml">
                <div class="photo-container">
                    <div data-column="photo"></div>
                </div>
                <div class="message-container">
                    <div data-column="name" class="name float-left"></div>
                    <div data-column="time" class="time float-left" ></div>
                    <div data-column="content" class = "contentContainer float-left" ></div>
                </div>
            </div>
            {{?}}
        </template>
    </div>
  1. Spread.Viewsのインスタンスを作成するための変数定義を追加します。列定義を追加します。 ``` var headerTemplate = '
    {{=it.name}}
    ';
    var peopleName = ['David Archer', 'Derek Smyth', 'Greg Boudreau', 'Israel Hernandez', 'Jatin Panchal', 'Prasanga Basnayake', 'Rob Swierczynski', 'Tomas Hood'];
    var timeFormatter = 'HH:mm tt';
    var photoPresenter = '<img class="employee-photo" src="{{=it.photo}}"/>';
    var contentPresenter = '<p class="chat-content">{{=it.content}}</p>';
    var columns = [{
        id: 'photo',
        dataField: 'photo',
        presenter: photoPresenter
    }, {
        id: 'name',
        dataField: 'name'
    }, {
        id: 'time',
        dataField: 'time',
        format: timeFormatter
    }, {
        id: 'content',
        dataField: 'content',
        presenter: contentPresenter
    }];
    ```
  2. rowTemplate定義を追加してから、テーブルに保存されたデータを呼び出す関数を定義します。
         var items = [];
                $.each(data, function(key, val) {
                    for (var prop in val) {
                        if (prop === 'time') {
                            val[prop] = new Date(val[prop]);
                        }

                        val.name = peopleName[Math.floor((Math.random() * 8))];
                        val.photo = './images/' + val.name + '.jpg';
                    }
                });

                var dataView1 = new GC.Spread.Views.DataView(document.getElementById('grid1'), data, columns, new GC.Spread.Views.Plugins.GridLayout({
                    grouping: [{
                            field: 'time',
                            header: {
                                visible: true,
                                template: headerTemplate,
                                height: 30
                            },
                            footer: {
                                visible: false
                            },
                            converter: function(time) {
                                return time.toDateString();
                            }
                        }

                    ],
                    autoRowHeight: true,
                    showRowHeader: false,
                    showColHeader: false,
                    rowTemplate: '#rowtml',
                    selectionMode: 'none'
                }));

                window.addEventListener('resize', function() {
                    dataView1.invalidate();
                });

                //focus data.view by default
        document.querySelector('#grid1').focus();